package com.thread.threadfirst.studyThread3;

import java.util.Arrays;

/**
 * 1、线程安全的单例模式
 * 阅读：https://www.cnblogs.com/xudong-bupt/p/3433643.html
 * 更好的是采用下面的方式，既不用加锁，也能实现懒加载（使用静态内部类）
 * 当然用枚举也可以实现
 * <p>
 * 注意：只有当调用getSingle()方法，执行到return Inner.s;时这个Inner类才加载进来，然后才初始化Singleton类，把需要的Singleton对象new出来，
 * 这涉及到了静态内部类的加载时机（在java基础分类中找）。
 */
public class Singleton {

    private Singleton() {
        System.out.println("single");
    }

    private static class Inner {
        private static Singleton s = new Singleton();
    }

    public static Singleton getSingle() {
        return Inner.s;
    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[200];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(() -> {
                Singleton.getSingle();
            }, "th_" + i);
        }
        Arrays.asList(threads).forEach(o -> o.start());

    }
}
